'use strict'
const path = require('path')

function resolve(dir){
  return path.join(__dirname, dir)
}

/**
 * vue.config.js 配置文件 有@vue/cli-server 加载
 * 以及各种loader 有服务加载
 */
// 去除console
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const VueLoaderPlugin = require("vue-loader");
// 压缩css、js
const CompressionWebpackPlugin = require('compression-webpack-plugin');
// 要压缩的文件
const productionGzipExtensions = ['js', 'css'];
module.exports = {
  // publicPath: '/os/',
  publicPath: '/',
  outputDir: 'dist',
  // 与springboot整合不能使用static作为静态资源目录
  assetsDir: 'assets',
  productionSourceMap: false,
  pwa: {
    iconPaths: {
      favicon32: 'favicon.ico',
      favicon16: 'favicon.ico',
      appleTouchIcon: 'favicon.ico',
      maskIcon: 'favicon.ico',
      msTileImage: 'favicon.ico',
    },
  },
  // webpack-dev-server相关配置
  devServer: {
    disableHostCheck: true,  // 关闭检查
    proxy: {
      // [process.env.VUE_APP_BASE_API]
      '/webapi': {
        // 外网地址
        // target: 'http://compile.epplink.net:12345/cgi-bin/webapi',
        // 内网地址
        // default port : 80
        // target: 'http://192.168.10.130/cgi-bin',  
        target: 'http://192.168.10.156/cgi-bin',  
        changeOrigin: true,
        ws: true,
        secure: false,  // https协议
        pathRewrite: {
          // 项目代理地址
          '^/webapi': '/webapi',
          // mock地址
          // '^/os': '/mock/16'
        }
      },
      '/conf': {
        // target: 'http://192.168.10.130/cgi-bin',
        target: 'http://192.168.10.156/cgi-bin',
        // target: 'http://192.168.10.126:8080/cgi-bin',
        changeOrigin: true,
        ws: true,
        secure: false,
        pathRewrite: {
          '^/conf': '../conf',
        }
      }
    }
  },
  transpileDependencies: ["element-ui", "lodash", "i18n",],
  configureWebpack: {
    resolve: {
      alias: {
        '@': resolve('src')
      }
    },
    performance: {
      // hints: false,
      hints: 'warning',
      // 入口点文件最大容量体积大小长度Byte
      maxEntrypointSize: 6000000,
      // 生成文件最大体积 字节
      maxAssetSize: 5000000,
      // 资源文件名过滤
      assetFilter(assetFilename) {
        return assetFilename.endsWith('.js') || assetFilename.endsWith('.css')
      },
    },
  },
  configureWebpack: config => {
    return {
      resolve: {
        alias: {
          '@': resolve('src')
        }
      },
      performance: {
        // hints: false,
        hints: 'warning',
        // 入口点文件最大容量体积大小长度Byte
        maxEntrypointSize: 6000000,
        // 生成文件最大体积 字节
        maxAssetSize: 5000000,
        // 资源文件名过滤
        assetFilter(assetFilename) {
          return assetFilename.endsWith('.js') || assetFilename.endsWith('.css')
        },
      },
      plugins: [
        ...config.plugins,
        new VueLoaderPlugin(),
      ],
      // optimization: {
      //   minimizer: [
      //     new UglifyJsPlugin({
      //       uglifyOptions: {
      //         // 删除注释
      //         output:{
      //           comments:false
      //         },
      //         // 删除console debugger 删除警告
      //         compress: {
      //           warnings: false,
      //           drop_console: true,//console
      //           drop_debugger: false,
      //           pure_funcs: ['console.log']//移除console
      //         }
      //       }
      //     })
      //   ]
      // }
    }
  },
  chainWebpack(config){
  //   config.plugins.delete('preload') // TODO: need test
  //   config.plugins.delete('prefetch') // TODO: need test

  //   config
  //     .plugin('webpack-bundle-analyzer') 
  //     .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
  //     .end() 
  //   // set svg-sprite-loader
  //   config.module
  //     .rule('svg')
  //     .exclude.add(resolve('src/assets/fonts'))
  //     .end()
  //   config.module
  //     .rule('icons')
  //     .test(/\.svg$/)
  //     .include.add(resolve('src/assets/fonts'))
  //     .end()
  //     .use('svg-sprite-loader')
  //     .loader('svg-sprite-loader')
  //     .options({
  //       symbolId: 'icon-[name]'
  //     })
  //     .end()

  //   // set preserveWhitespace
    // config.module
    //   .rule('vue')
    //   .test(/\.vue$/)
    //   .use('vue-loader')
    //   .loader('vue-loader')
    //   .tap(options => {
    //     options.compilerOptions.preserveWhitespace = true
    //     return options
    //   })
    //   .end()

  //   config
  //   // https://webpack.js.org/configuration/devtool/#development
  //     .when(process.env.NODE_ENV === 'development',
  //       config => config.devtool('cheap-source-map')
  //     )

  //   config
  //     .when(process.env.NODE_ENV !== 'development',
  //       config => {
  //         config
  //           .plugin('ScriptExtHtmlWebpackPlugin')
  //           .after('html')
  //           .use('script-ext-html-webpack-plugin', [{
  //           // `runtime` must same as runtimeChunk name. default is `runtime`
  //             inline: /runtime\..*\.js$/
  //           }])
  //           .end()

  //         /** gzip 压缩 */
        config.when(process.env.NODE_ENV==="development", config => {
          config
            .plugin('compressionPlugin')
            .use(require("compression-webpack-plugin"))
            .tap(() => [
              {
                test: /\.js$|\.html$|\.css/, // 匹配文件名
                // test: new RegExp('\\.(js|css)$'), //压缩 js 与 css
                algorithm: 'gzip', //算法
                threshold: 10240,//只处理比这个值大的资源。按字节计算
                deleteOriginalAssets: true, // 是否删除源文件
                minRatio: 0.8, //只有压缩率比这个值小的资源才会被处理 
                filename: '[path].gz[query]', //目标资源名称。[file] 会被替换成原资源。[path] 会被替换成原资源路径，[query] 替换成原查询字符串
              }
            ])
          const UglifyJsWebpackPlugin = require("uglifyjs-webpack-plugin")
          /** 去掉console.log debugger sourceMap*/
          // config.optimization.minimizer([
          //   new UglifyJsWebpackPlugin({

          //     /** 这个 sourceMap注释掉，默认就是置为false.(写为false 也是可以的)。
          //      * 反之设为true 是生效的。
          //      * 故在官方的配置(productionSourceMap: false)就可以注释掉了*/
          //     sourceMap: false,
          //     uglifyOptions: {
          //       warnings: false,
          //       compress: {
          //         drop_console: true,
          //         drop_debugger: true
          //       }
          //     }
          //   })
          // ])
          // config.optimization
          //   .minimizer("js")
          //   .use(UglifyJsWebpackPlugin, [{

          //     /** 这个 sourceMap注释掉，默认就是置为false.(写为false 也是可以的)。
          //      * 反之设为true 是生效的。
          //      * 故在官方的配置(productionSourceMap: false)就可以注释掉了*/
          //     sourceMap: false,   // 去除打包后生成的.map文件
          //     parallel: true,
          //     uglifyOptions: {
          //       warnings: false,
          //       compress: {
          //         drop_console: true,
          //         drop_debugger: true,
          //         pure_funcs:['console.log'], // 移除console
          //       }
          //     },
          //   }])
          })

  //         config.optimization.splitChunks({
  //           chunks: 'all',
  //           minSize: 30000, // 字节 引入的文件大于30kb才进行分割
  //           minChunks: 1, // 模块至少使用次数
  //           maxAsyncRequests: 5, // 同时加载的模块数量最多是5个，只分割出同时引入的前5个文件
  //           maxInitialRequests: 3, // 首页加载的时候引入的文件最多3个
  //           automaticNameDelimiter: '~', // 缓存组和生成文件名称之间的连接符
  //           name: true, // 缓存组里面的filename生效，覆盖默认命名
  //           cacheGroups: {
  //             libs: {
  //               name: 'chunk-libs',
  //               test: /[\\/]node_modules[\\/]/,
  //               priority: -10,
  //               chunks: 'initial'
  //             },
  //             elementUI: {
  //               name: 'chunk-elementUI', // split elementUI into a single package
  //               priority: -5, // the weight needs to be larger than libs and app or it will be packaged into libs or app
  //               test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
  //             },
  //             avue: {
  //               name: 'chunk-avue', // split elementUI into a single package
  //               priority: -5, // the weight needs to be larger than libs and app or it will be packaged into libs or app
  //               test: /[\\/]node_modules[\\/]_?@smallwei(.*)/ // in order to adapt to cnpm
  //             },
  //             commons: {
  //               name: 'chunk-commons',
  //               test: resolve('src/components'), // can customize your rules
  //               minChunks: 2, //  minimum common number
  //               priority: 10,
  //               reuseExistingChunk: true
  //             }
  //           }
  //         })
  //         config.optimization.runtimeChunk({
  //           name: 'manifest' 
  //         })
  //       }
  //     )
  }
}
